import Vue from 'vue'
import router from '@/router'
import { removeToken } from '@/utils/auth'
import { download } from '@/api/main'
import { Notification, MessageBox, Loading } from 'element-ui'
import Cookies from 'js-cookie'

const publicConfig = {
  'ITPS-SUBMIT': 'ITPS-SUBMIT', // 提交
  'ITPS-CHECK': 'ITPS-CHECK', // 审核
  'SYS-BUTTON': 'SYS-BUTTON', // 按钮
  'ITPS-ADD': 'ITPS-ADD', // 添加
  'ITPS-VIEW': 'ITPS-VIEW', // 查看
  'ITPS-UPDATE': 'ITPS-UPDATE', // 编辑
  'ITPS-DELETE': 'ITPS-DELETE', // 删除
  'ITPS-KANBAN': 'ITPS-KANBAN', // 看板
  'ITPS-PART': 'ITPS-PART', // 零部件
  'ITPS-ANNEX': 'ITPS-ANNEX', // 附件
  'ITPS-RESET': 'ITPS-RESET', // 重置密码
  'ITPS-DISPOSE': 'ITPS-DISPOSE', // 配置年计划
  'ITPS-CHANGE': 'ITPS-CHANGE', // 模板变更
  'ITPS-EXPORT': 'ITPS-EXPORT', // 导出
  'ITPS-IMPORT': 'ITPS-IMPORT', // 导入
  'ITPS-SURE': 'ITPS-SURE', // 确认
  '001': '001', // 所属专业
  '002': '002', // 技能等级
  '003': '003', // 部门类型
  '004': '004', // 性别
  '005': '005', // 婚姻状况
  '006': '006', // 学历
  '007': '007', // 政治面貌
  '008': '008', // 民族
  '009': '009', // 专业技术职务
  '010': '010', // 铁路局
  '011': '011', // 线路
  '012': '012', // 车站(区站)
  '013': '013', // 铁路类别
  '014': '014', // 线路类型
  '015': '015', // 线路等级
  '016': '016', // 速度等级
  '017': '017', // 悬挂类型
  '018': '018', // 供电方式
  '019': '019', // 道床类型
  '020': '020', // 区站类型
  '021': '021', // 补偿类型
  '022': '022', // 支柱类型
  '023': '023', // 发文机构
  '024': '024', // 密级
  '025': '025', // 微服务
  '026': '026', // 支柱基础状态
  '027': '027', // 基础类型
  '028': '028', // 地线状态
  '029': '029', // 零部件类型
  '030': '030', // 使用状态
  '031': '031', // 安全事故案例等级
  '032': '032', // 接触网分工岗位类型
  '033': '033', // 角色首页
  '034': '034', // 变电所类型
  '035': '035', // 供电方式（变电所）
  '036': '036', // 性质（变电所）
  '037': '037', // 证书类型（职工）
  '038': '038', // 证书等级（职工）
  '039': '039', // 电压等级（跨越线）
  '040': '040', // 绝缘措施类型（跨越线）
  '041': '041', // 污染源类型
  '042': '042', // 绝缘子类型
  '043': '043', // 危险源类型
  '044': '044', // 防洪等级
  '045': '045', // 危树等级
  '046': '046', // 归属类型（供电一级平台-安全管理）
  '047': '047', // 检查类型（供电一级平台-安全管理）
  '048': '048', // 问题类别（供电一级平台-安全管理）
  '049': '049', // 责任类型（供电一级平台-故障管理）
  '050': '050', // 故障类型（供电一级平台-故障管理）
  '051': '051', // 规格（关键设备）
  '052': '052', // 型号（关键设备）
  '053': '053', // 厂家（关键设备）
  '054': '054', // 工作属性（重点督办工作）
  '055': '055', // 缺陷分类
  '057': '057', // 作业车运行状态
  '058': '058', // 作业车试验周期
  '059': '059', // 层级
  '060': '060' // 安全等级（职工管理）
}

export function jumpToLogin() {
  removeToken()
  Cookies.remove('userInfo')
  Cookies.remove('navigationInfo')
  window.localStorage.clear()

  // location.href = '/login?redirect=/jcwsc/welcome'
  // router.push('/login')
  const __qiankun__ = window.__POWERED_BY_QIANKUN__
  if (__qiankun__ || process.env.NODE_ENV === 'production') {
    if (self.frameElement && self.frameElement.tagName === 'IFRAME') {
      parent.location.reload()
    } else {
      window.location.assign('/login')
    }
  } else {
    window.location.assign('/login?redirect=/cms/welcome')
  }
}

export const downloadIamge = function(imgsrc, name) { // 下载图片地址和图片名
  var image = new Image()
  // 解决跨域 Canvas 污染问题
  image.setAttribute('crossOrigin', 'anonymous')
  image.onload = function() {
    var canvas = document.createElement('canvas')
    canvas.width = image.width
    canvas.height = image.height
    var context = canvas.getContext('2d')
    context.drawImage(image, 0, 0, image.width, image.height)
    var url = canvas.toDataURL('image/png') // 得到图片的base64编码数据

    var a = document.createElement('a') // 生成一个a元素
    var event = new MouseEvent('click') // 创建一个单击事件
    a.download = name || 'photo' // 设置图片名称
    a.href = url // 将生成的URL设置为a.href属性
    a.dispatchEvent(event) // 触发a的单击事件
  }
  image.src = imgsrc
}

/**
 * 下载文件公用方法
 * @param {(string)} url
 * @param {(string)} fileName
 */
export const downloadFile = function({ url, fileName }) {
  if (url.startsWith('group')) {
    url = '/dfile/file/download?fileUrl=' + url
  }
  return download(url).then((res) => {
    const reader = new FileReader()
    reader.onload = function() {
      try {
        const resData = JSON.parse(this.result)
        notifiyError(resData.message)
      } catch (err) {
        // 创建隐藏的可下载链接
        const eleLink = document.createElement('a')
        eleLink.download = fileName
        eleLink.style.display = 'none'
        const headers = res.headers
        // 字符内容转变成blob地址
        const blob = new Blob([res.data], {
          type: headers['Content-Type']
        })
        eleLink.href = URL.createObjectURL(blob)
        // 触发点击
        document.body.appendChild(eleLink)
        eleLink.click()
        // 然后移除
        document.body.removeChild(eleLink)
      }
    }
    reader.readAsText(res.data)
  }).catch(error => {
    const reader = new FileReader()
    reader.onload = function() {
      try {
        const resData = JSON.parse(this.result)
        notifiyError(resData.message)
      } catch (err) {
        Promise.reject(error)
      }
    }
    reader.readAsText(error.response.data)
    return Promise.reject(error)
  })
}

export const checkPermission = function(val) {
  const actions = router.currentRoute.meta.actions
  return (!!actions && actions instanceof Array && actions.includes(val))
}

export const formatRoad = function(val) {
  if (!val && val !== 0) return ''
  let value = val.toString()
  if (value.startsWith('-')) {
    value = '-K' + value.slice(1).replace(/\./, '+')
  } else {
    value = 'K' + value.replace(/\./, '+')
  }
  if (value.includes('+')) {
    const int = value.slice(0, value.indexOf('+'))
    const decimal = value.slice(value.indexOf('+') + 1)
    value = int +
            '+' +
            (decimal.length <= 3 ? decimal + '0'.repeat(3 - decimal.length) : decimal.slice(0, 3))
    // '.' +
    // (decimal.length <= 3 ? '00' : decimal.slice(3) + '0'.repeat(5 - decimal.length > 0 ? 5 - decimal.length : 0))
  } else {
    value = value + '+000'
    // value = value + '+000.00'
  }
  return value
}

export const tableMixin = {
  mounted() {
    this.height = this.$refs.main.offsetHeight - 10
    window.onresize = _ => {
      this.$nextTick(_ => {
        this.height = this.$refs.main.offsetHeight - 10
      })
    }
  },
  destroyed() {
    window.onresize = null
  },
  activated() {
    this.height = 0
    this.$nextTick(_ => {
      this.height = this.$refs.main.offsetHeight - 10
    })
    window.onresize = _ => {
      this.$nextTick(_ => {
        this.height = this.$refs.main.offsetHeight - 10
      })
    }
  }
}

/**
 * 表单验证
 * @param {(string)} el
 */
export const validate = function(el) {
  let fn = null
  this.$refs[el || 'dataForm'].validate((valid) => {
    if (valid) {
      fn = Promise.resolve(valid)
    } else {
      fn = Promise.reject('err')
    }
  })
  return fn
}

/**
 * 成功提示
 * @param {(string)} message
 * @param {(string)} title
 */
export const notifiySuccess = function(message, title) {
  Notification({
    title: title || '成功',
    message: message || '操作成功',
    type: 'success',
    duration: 3 * 1000
  })
}

/**
 * 错误提示
 * @param {(string)} message
 * @param {(string)} title
 */
export const notifiyError = function(message, title, duration) {
  Notification({
    title: title || '错误',
    message: message || 'Error',
    type: 'error',
    duration: duration || 3 * 1000
  })
}

/**
 * 警告提示
 * @param {(string)} message
 * @param {(string)} title
 */
export const notifiyWarning = function(message, title) {
  Notification({
    title: title || '警告',
    message: message || 'warning',
    type: 'warning',
    duration: 3 * 1000
  })
}

/**
 * 消息提示
 * @param {(string)} message
 * @param {(string)} title
 */
export const notifiyInfo = function(message, title) {
  Notification({
    title: title || '消息',
    message: message || 'info',
    type: 'info',
    duration: 3 * 1000
  })
}

/**
 * 确认对话框
 * @param {(string)} message
 * @param {(Object)} opt
 */
export const confirmBox = async function(message, opt = {}) {
  let fn = null
  const option = Object.assign({
    title: '提示',
    message: message || '消息',
    showCancelButton: true,
    showInput: false,
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }, opt)
  await MessageBox(option).then(action => {
    fn = Promise.resolve(action)
  }).catch(res => {
    fn = Promise.reject(res)
  })
  return fn
}

// 数据合并
export function mergeRecursive(source, target) {
  for (var p in target) {
    try {
      if (target[p].constructor === Object) {
        source[p] = mergeRecursive(source[p], target[p])
      } else {
        source[p] = target[p]
      }
    } catch (e) {
      source[p] = target[p]
    }
  }
  return source
}

export const loadingInstance = function(options) {
  const defaultOptions = {
    text: '加载中',
    background: 'rgba(0, 0, 0, 0.8)'
  }
  return Loading.service(Object.assign({}, defaultOptions, options))
}

// 系统内访问public文件夹的静态资源时的路径    因为生产环境不在根目录下
export const publicPath = process.env.NODE_ENV === 'development' ? '' : '/jcwsc'
// export const publicPath = process.env.NODE_ENV === 'development' ? '' : '/subApp/jcwsc'

Vue.prototype.publicConfig = publicConfig
Vue.prototype.$checkPermission = checkPermission
Vue.prototype.downloadFile = downloadFile
Vue.prototype.validate = validate
Vue.prototype.formatRoad = formatRoad
Vue.prototype.notifiySuccess = notifiySuccess
Vue.prototype.notifiyError = notifiyError
Vue.prototype.notifiyWarning = notifiyWarning
Vue.prototype.notifiyInfo = notifiyInfo
Vue.prototype.confirmBox = confirmBox
Vue.prototype.publicPath = publicPath
